package 链表;

/**
 * 21. 合并两个有序链表
 *
 * 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
 *
 * 思路：使用一个虚拟节点，然后比较两个链表的大小
 *    如果list1的值小于list2的值，则将list1的值赋值给虚拟节点，然后list1后移一位，虚拟节点后移一位
 */
public class L_21 {

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 虚拟链表节点
        ListNode dummy = new ListNode(-1);

        ListNode curr = dummy;
        while (list1 != null && list2 != null){
            int node1Val = list1.val;
            int node2Val = list2.val;
            if(node1Val < node2Val){
                curr.next = list1;
                list1 = list1.next;
            }else {
                curr.next = list2;
                list2 = list2.next;
            }
            curr = curr.next;
        }

        if(list1 != null){
            curr.next = list1;
        }else {
            curr.next = list2;
        }
        return dummy.next;
    }

    public class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val,ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
}
